/**
 * @file logproxy.c
 * @brief Sorgente di definizione dell'entità proxy per il logging.
 *
 * Costituisce un'implementazione di base che potrebbe esser sostituita con un'apposita libreria.
 *
 * @date Mar 3, 2012
 * @author Francesco Corvino
 */
#include "logproxy.h"

static void (*_logging_outputChannel)(char* msg) = NULL;

static int (*_logging_isNamePrintable)(char*name) = NULL;

static int (*_logging_isLevelPrintable)(int level) = NULL;

void Logging_setLoggingOut(void (*fn)(char*msg)){
	_logging_outputChannel = fn;
}

void Logging_setLoggingNameSelector(int (*fn)(char*msg)){
	_logging_isNamePrintable = fn;
}

void Logging_setLoggingLevelSelector(int (*fn)(int level)){
	_logging_isLevelPrintable = fn;
}

bool _logging_isPrintable(char * name, int * level){
	bool print = false;
	// controlla se è stampabile per il nome
	if((name!=NULL) && (_logging_isNamePrintable!=NULL)){
		print = (*_logging_isNamePrintable)(name);
	}
	// controlla se è stampabile per il livello
//	if((level!=NULL) && (_logging_isLevelPrintable!=NULL))
//		if((*_logging_isLevelPrintable)(*level)) print = true;
	return print;
}

/**
 * @brief Riferimento nelle funzioni locali ai logger.
 *
 * Funzione proxy verso le librerie di logging: se si vuole abilitare le funzioni di
 * logging settare il corretto puntatore a funzione o modificare le funzioni interne
 *
 * @see Invoker_SetLog() funzione per settare il logger.
 * @param args argomento stringa da passare alle funzioni
 */
void log_simple(char* format,...){
	char msg[LOG_MAXLENGHT_MSG];
	va_list args;
	va_start( args, format );
	vsprintf(msg,format,args);
	va_end( args );

	if(_logging_outputChannel!=NULL) (*_logging_outputChannel)(msg);
}

void log_level(int level, char * format,...){
	if(!_logging_isPrintable(NULL,&level)) return;

	char msg[LOG_MAXLENGHT_MSG];
	va_list args;
	va_start( args, format );
	vsprintf(msg,format,args);
	va_end( args );

	if(_logging_outputChannel!=NULL) (*_logging_outputChannel)(msg);
}

void log_named(char *name, char *format,...){
	if(!_logging_isPrintable(name,NULL)) return;

	char msg[LOG_MAXLENGHT_MSG];
	va_list args;
	va_start( args, format );
	vsprintf(msg,format,args);
	va_end( args );

	if(_logging_outputChannel!=NULL) (*_logging_outputChannel)(msg);
}

/**
 * @brief Log o per livello o per nome;
 */
void log_namedlevel(char *name, int level, char *format,...){
	if(!_logging_isPrintable(name,&level)) return;

	char msg[LOG_MAXLENGHT_MSG];
	va_list args;
	va_start( args, format );
	vsprintf(msg,format,args);
	va_end( args );
	char NameMsg[LOG_MAXLENGHT_MSG];
	sprintf(NameMsg,"%s:%s",name,msg);
	if(_logging_outputChannel!=NULL) (*_logging_outputChannel)(NameMsg);
}
